// RTC Demo Basique
#ifdef __USE_CMSIS
#include "LPC17xx.h"
#endif

#include <cr_section_macros.h>
#include <NXP/crp.h>

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

#include <stdio.h>

void RTC_IRQHandler(void);

int main(void)
{
    volatile static int i = 0 ;
    printf("RTC basic\n");

    LPC_SC->PCONP |= 1<<9; // Allume RTC, bit 9

    // Inhibe toutes les alarmes possibles par le Masque Alarme
    // Si Bit a 1 = ne tient pas en compte parametre pour l'alarme (annee,mois,DOW,DOM,DOY,heure,min,sec)
    LPC_RTC->AMR = (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0); // Alarme sur seconde

    LPC_RTC->CCR = 0;  // inhibe RTC pendant initialisation

    	LPC_RTC->HOUR = 0; // 0 a 23
    	LPC_RTC->MIN = 0;  // 0 a 59
    	LPC_RTC->SEC = 0;  // 0 a 59
    	LPC_RTC->YEAR = 2012; // 0 a 4095
    	LPC_RTC->MONTH = 9; // 1 a 12
    	LPC_RTC->DOW = 1; // 0 a 6
    	LPC_RTC->DOM = 1; // 1 a 31
    	LPC_RTC->DOY = 1; // 1 a 366

     LPC_RTC->CCR = 1; // autorise RTC

     // Masque Alarme
     // Si Bit a 1 = ne tient pas en compte pour l'alarme, si bit a 0 => alarme sur ce parametre
     LPC_RTC->AMR = (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0); // Alarme sur seconde

     // Config Alarme
     LPC_RTC->ALHOUR = 0;
     LPC_RTC->ALMIN = 0;
     LPC_RTC->ALSEC = 15; // alarm si heure et 15 secondes
     LPC_RTC->ALYEAR = 2013;
     LPC_RTC->ALMON = 9;
     LPC_RTC->ALDOW = 1;
   	 LPC_RTC->ALDOM = 1;
     LPC_RTC->ALDOY = 1;

     // Masque Alarme
     // Si Bit a 1 = ne tient pas en compte pour l'alarme
     LPC_RTC->AMR = (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0); // Alarme sur seconde

     // Demo CIIR
     //LPC_RTC->CIIR = 1<<0; // une IRQ declenchee toutes les sec
     LPC_RTC->CIIR =  1<<1;  // une IRQ declenchee toutes les min

     NVIC_EnableIRQ(RTC_IRQn);

    while(1)
    {
        printf("Heure %02d:%02d:%02d\n", LPC_RTC->HOUR, LPC_RTC->MIN,
LPC_RTC->SEC);
        for(i=0; i < 8000000; i++);
    }
    return 0 ;
}
void RTC_IRQHandler(void)
{
//	printf("IRQ RTC !\n");
	// Source de l'interrupt ? 2 possibilites : CIIR ou Alarm Registers
	if ( LPC_RTC->ILR & 1 )
	{
		printf("IRQ RTC generee par Counter Increment Interrupt Block!\n");
		LPC_RTC->ILR = 1; // RAZ Int, sinon on boucle indefiniment dans RTC_IRQHandler
	}
	if ( LPC_RTC->ILR & 2 )
	{
		printf("IRQ RTC generee par Alarm Register !\n");
		LPC_RTC->ILR = 2; // RAZ Int
	}
}
